package com.xncoding.aop.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.List;
@Aspect
@Component
public class AopAxecution {

    /**
     * 匹配特定类中的所有方法
     * 这个表达式将匹配com.xncoding.aop.controller.UserController类中的所有方法，不论它们的返回类型、访问修饰符或参数列表如何
     * - * 表示返回类型任意。
     * - com.example.service.UserService 表示特定的类名。
     * - * 表示方法名任意。
     * - (..) 表示参数任意。
     */
    @Pointcut("execution(* com.xncoding.aop.controller.UserController.*(..))")
    public void execution00(){};

    /**
     * 匹配特定包下所有类的公共方法
     *这个表达式将匹配com.xncoding.aop包及其所有子包下所有类的公共方法。
     * - public 表示只匹配公共方法。
     * - * 表示返回类型任意。
     * - com.example.dao..* 表示com.example.dao包及其所有子包下的任意类。
     * - * 表示方法名任意。
     * - (..) 表示参数任意。
     */
    @Pointcut("execution(public * com.xncoding.aop.controller..*(..))")
    public void execution01(){};

    /**
     * 匹配具有特定参数的方法
     *这个表达式将匹配com.example.service包下所有类中具有一个int类型和一个String类型参数的方法
     * - * 表示返回类型任意。
     * - com.example.service.* 表示com.example.service包下的任意类。
     * - * 表示方法名任意。
     * - (int, String) 表示方法有两个参数，第一个参数是int类型，第二个参数是String类型。
     */
    @Pointcut("execution(* com.xncoding.aop.controller.*.*( String , Integer))")
    public void execution02(){};

    /**
     * 匹配具有特定返回类型和参数的方法
     * - 返回结果为String。
     * - 表示ccom.xncoding.aop.controller包下的任意类。
     * - find* 表示以find开头的方法名。
     * - (..) 表示参数任意
     */
    @Pointcut("execution( String com.xncoding.aop.controller.*.find*(..))")
    public void execution03(){};




    @Around("execution00()")
    public Object arround00(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("execution00方法环绕start.....");
        try {
            Object o =  pjp.proceed();
            System.out.println("execution00方法环绕end.....");
            return o;
        } catch (Throwable e) {
            throw e;
        }
    }

    @Around("execution01()")
    public Object arround01(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("execution01 方法环绕start.....");
        try {
            Object o =  pjp.proceed();
            System.out.println("execution01 方法环绕end.....");
            return o;
        } catch (Throwable e) {
            throw e;
        }
    }

    @Around("execution02()")
    public Object arround02(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("execution02 方法环绕start.....");
        try {
            Object o =  pjp.proceed();
            System.out.println("execution02 方法环绕end.....");
            return o;
        } catch (Throwable e) {
            throw e;
        }
    }

    @Around("execution03()")
    public Object arround03(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("execution03 方法环绕start.....");
        try {
            Object o =  pjp.proceed();
            System.out.println("execution03 方法环绕end.....");
            return o;
        } catch (Throwable e) {
            throw e;
        }
    }

}
